package main

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"time"
)

//var ctx = context.Background()
/**
需要注意的是，第一个参数需要传入 context.Context 类型的参数，作为传入请求的顶级上下文
*/
var ctx = context.Background()

func ExampleClient() {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})
	/**
	expiration接收的是time.Duration类型, 传入0可默认key不过期, 但传入大于0的值只能以time.Duration格式.
	Set 参数： context.Background(),key ,value,过期时间
	err = client.Set(UserId, Bstr, 300*time.Second).Err()
	err = client.Set(UserId, Bstr, time.Duration(30)*time.Second).Err()
	**/
	err := rdb.Set(ctx, "kddd", "value", 10*time.Second).Err()
	if err != nil {
		panic(err)
	}
	//批量操作
	err = rdb.Do(ctx, "MSet", "cccc", 100, "bbb", 300).Err()
	if err != nil {
		fmt.Println(err)
		return
	}
	u, err := rdb.Do(ctx, "MGet", "cccc", "bbb").Result()
	if err != nil {
		fmt.Println("get abc failed,", err)
		return
	}
	fmt.Println(u)
	of := u.([]interface{})
	for _, g := range of {
		fmt.Println(g)
	}
	//of := reflect.ValueOf(u).Interface().([]interface{})
	//for _, g := range of {
	//	fmt.Println(g)
	//}
	/**
	获取的值类型是interface {}类型，而不是[]interface {}类型，所以，不能使用range，可以先通过reflect查看获取到的值的类型，在做处理
	 .Result() | interface{}
	for _,g:= range u{
		fmt.Println(g)
	}
	*/
	//设置过期时间
	err = rdb.Do(ctx, "expire", "cccc", 10).Err()
	if err != nil {
		fmt.Println(err)
		return
	}

	val, err := rdb.Get(ctx, "kddd").Result()
	if err != nil {
		if err == redis.Nil {
			fmt.Println("key does not exists")
			return
		}
		panic(err)
	}
	fmt.Println(val)
	rdb.Get(ctx, "kddd")

	//List队列操作
	err = rdb.LPush(ctx, "book_list", "abc", "ceg", 10*time.Second).Err()
	if err != nil {
		fmt.Println(err)
	}

	lpo := rdb.LPop(ctx, "book_list").String()
	fmt.Println(lpo)

	//操作Hash
	err = rdb.HSet(ctx, "bbbbbb", 12, 10*time.Second).Err()
	if err != nil {
		fmt.Println(err)
	}
	d := rdb.HGet(ctx, "bbbbbb", "a").String()
	fmt.Println(d)

	//执行完操作关闭redis
	defer rdb.Close()

}
func main() {

	ExampleClient()
}
